/**
 * 
 */
package de.htw_saarland.webservices.robotersteuerung;

import java.util.LinkedList;
import java.util.Random;

import willy.communication.RoboFactory;

import de.htw_saarland.webservices.robotersteuerung.data.RobotData;
import de.htw_saarland.webservices.robotersteuerung.data.SensorData;
import de.htw_saarland.webservices.xml.BookingListHandler;
import de.htw_saarland.webservices.xml.RobotListReader;
import de.htw_saarland.webservices.xml.SensorListHandler;

/**
 * @author Sascha
 *
 */
public class DataFacade {
	
	// Aufruf dient zum Erstellen des Singletons! 
	public static DataFacade getDataFacade = new DataFacade(); 
	
	/**
	 * Konstruktor private da Singleton ! 
	 */
	private DataFacade()
	{
		
	}
	
	/**
	 * Methode dient zum Ermitteln der Roboter! 
	 * @return Liste mit Robotern
	 */
	public LinkedList<RobotData> getRobotData()
	{
		RobotListReader rlr = new RobotListReader(); 
			
		LinkedList<RobotData> robotList = rlr.getRobotList(); 
	
		return robotList; 
	}
	
	/**
	 * Methode dient zum Ermitteln aller Sensoren für einen bestimmten Roboter
	 * @param robotID ID zum Roboter! 
	 * @return Sensor Liste 
	 */
	public LinkedList<SensorData> getSensorDataList(String robotID)
	{
		LinkedList<SensorData> sensorList = new LinkedList<SensorData>(); 
		
		SensorListHandler slh = new SensorListHandler(); 
		sensorList = slh.getSensorList(robotID); 
		
		return sensorList; 
	}
	
	/**
	 * Diese Methode liefert die Daten für einen bestimmten Sensor eines bestimmten Roboters zurück
	 * @param roboID RoboterID
	 * @param sensorID Die Sensor ID 
	 * @return Datenpaket
	 */
	public SensorData getSensorData(String roboID, String sensorID)
	{
//		return this.generateFakeSensorData(); 
		RoboFactory robo_factory = RoboFactory.getInstance;
		
		// Dieses Objekt spiegelt die Sensordaten der nativen Library wieder
		// die Daten müssen erst in den Container des Webservices Übertragen werden
		willy.communication.SensorData native_sensor_data;
		
		// Resultierender SensordatenContainer
		SensorData result = new SensorData(); 
		
		native_sensor_data = robo_factory.getSensorData(roboID, sensorID);
		
		// Die Werte des Nativen Sensorobjekts werden in den des Webservices transformiert
		result.id = "" + native_sensor_data.id;
		result.value = 0.0 + native_sensor_data.value;
		result.description = "native NXT values";		
		
		return result;		
	}
	
	/** 
	 * Methode dient zum Buchen eines Roboters 
	 * @param roboID 
	 * @param userID
	 * @return true wenns funktioniert hat, false wenn etwas schief lief
	 */
	public boolean bookRobot(String roboID, String userID)
	{
		BookingListHandler handler = new BookingListHandler(); 
		
		return handler.bookRobo(roboID, userID); 
	}
	
	/**
	 * Fassadenmethode zum Canceln eines Roboters 
	 * @param roboID
	 * @param userID
	 * @return
	 */
	public boolean cancelRobot(String roboID, String userID) 
	{
		BookingListHandler handler = new BookingListHandler(); 
		
		return handler.cancelRobot(roboID, userID); 
	}

	
	
	
	
	
	
	
	
	/**
	 * Methode dient nur zum Erstellen von Fakerobotern ;) 
	 * @return
	 */
	protected RobotData generateFakeRoboData()
	{
		Random rand = new Random(); 
		String id = "ID" + rand.nextInt(1000); 
		RobotData data = new RobotData(id, "Description!!!"); 
		return data; 
	}
	
	/**
	 * Methode zum generieren von Fake SensorDaten! 
	 * @return FakeSensor
	 */
	protected SensorData generateFakeSensorData()
	{
		Random rand = new Random(); 
		String id = "ID" + rand.nextInt(1000); 
		SensorData data = new SensorData(); 
		data.id = id;
		data.value = rand.nextDouble(); 
		data.description = "Description"; 
		return data; 
	}


}
